/*
 * TasaFactorDescuento.java
 *
 * Created on 30 de enero de 2007, 10:23 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package ig.metrica;

import ig.finanzas.DefinidorCalculoCambioEsperado;
import ig.finanzas.Modalidad;
import ig.finanzas.Tasa;
import ig.util.TirOfFlujo;
import ig.util.ejb.IGBean;
import ig.util.excepciones.DatoInvalidoExcepcion;
import ig.util.excepciones.LogicaExcepcion;
import java.rmi.RemoteException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.Date;
import java.util.Hashtable;
import javax.ejb.EJBException;
import javax.ejb.EJBHome;
import javax.ejb.EJBObject;
import javax.ejb.Handle;
import javax.ejb.RemoveException;


/**
 *
 * @author jsanchez
 */
public class TasaFactorDescuento extends IGBean implements Tasa {

    String nombre = null;
    Long idContrato = null;
    String fuente = null;
    String campo = "TASA_DESCUENTO";
    String tipo = null;
    boolean isTirOfFlujo = false;

    /**
     * Creates a new instance of TasaFactorDescuento
     */
    public TasaFactorDescuento(String _nombre, String _fuente, Long _idContrato, boolean _isTirOfFlujo) {
        this.nombre = _nombre;
        this.idContrato = _idContrato;
        this.fuente = _fuente;
        this.isTirOfFlujo = _isTirOfFlujo;
    }

    public void setCampo(String campo) {
        this.campo = campo;
    }

    public String getCampo() {
        return campo;
    }

    public void setFuente(String fuente) {
        this.fuente = fuente;
    }

    public String getFuente() {
        return fuente;
    }

    public String getNombre() throws RemoteException {
        return nombre;
    }

    public String getTipo() throws RemoteException {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public Modalidad getModalidadTasa() throws RemoteException {
        return null;
    }
    private Hashtable<String, Double> hTirOfFlujo = new Hashtable<String, Double>();
    private Hashtable<String, Double> hNormal = new Hashtable<String, Double>();

    public double obtenerValorVigenteA(Date fecha, int numdias) throws DatoInvalidoExcepcion, LogicaExcepcion, RemoteException {
        Double tir = null;
        if (this.isTirOfFlujo) {
            tir = hTirOfFlujo.get(fecha.toString() + idContrato);
            if (tir == null) {
                tir = this.obtenerTirOfFlujo(fecha);
                if (tir == null || tir.equals(0.0) || tir > 2 || tir < -2) {
                    tir = this.obtenerValorVigenteANormal();
                }
                if (tir != null) {
                    hTirOfFlujo.put(fecha.toString() + idContrato, tir);
                }
            }
        } else {
            tir = hNormal.get(fecha.toString() + idContrato);
            if (tir == null) {
                tir = this.obtenerValorVigenteANormal();
                if (tir != null) {
                    hNormal.put(fecha.toString() + idContrato, tir);
                }
            }
        }
        return tir != null ? tir : -1;
    }

    public double obtenerValorVigenteANormal() throws DatoInvalidoExcepcion, LogicaExcepcion, RemoteException {
        String Query = "SELECT "+campo+" FROM " + fuente.toUpperCase() + " WHERE ID=?";
        PreparedStatement prep = null;
        ResultSet res = null;
        try {
            conn = getConexion("METRICADB");
            prep = conn.prepareStatement(Query);
            prep.setLong(1, this.idContrato);
            res = prep.executeQuery();

            Double TASA_DESCUENTO = null;
            if (res.next()) {
                TASA_DESCUENTO = res.getDouble(campo);
            }
            return TASA_DESCUENTO;
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                conn.close();
            } catch (Exception e) {
            }
            try {
                prep.close();
            } catch (Exception e) {
            }
            try {
                res.close();
            } catch (Exception e) {
            }
        }
        return -1;

    }

    private double obtenerTirOfFlujo(Date fecha) throws DatoInvalidoExcepcion, LogicaExcepcion, RemoteException {
        try {
            conn = getConexion("METRICADB");
            String COSULTA =
                    "SELECT ? AS FECHA, -SALDOCONTABLE AS CAPITAL, 0 AS INTERESFIJO, 0 AS INTERESVARIABLE, 1 AS CONOCIDO " +
                    "FROM CONTRATOS WHERE ID = " + idContrato +
                    " UNION " +
                    "SELECT FECHA,CAPITAL,INTERESFIJO,INTERESVARIABLE,CONOCIDO FROM FLUJOS WHERE IDCONTRATO = " + idContrato +
                    " AND FECHA > ? ";
            return TirOfFlujo.getTir(conn, null, null, COSULTA, new Timestamp(fecha.getTime()));
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                conn.close();
            } catch (Exception e) {
            }
        }
        return -1;
    }

    public double cambioEsperadoValoresRegistrados(Date fecha, DefinidorCalculoCambioEsperado definidor) throws DatoInvalidoExcepcion, LogicaExcepcion, RemoteException {
        return 0.0;
    }

    public EJBHome getEJBHome() throws RemoteException {
        return null;
    }

    public Handle getHandle() throws RemoteException {
        return null;
    }

    public Object getPrimaryKey() throws RemoteException {
        return null;
    }

    public boolean isIdentical(EJBObject eJBObject) throws RemoteException {
        return false;
    }

    public void remove() throws RemoteException, RemoveException {
    }

    public void unsetEntityContext() throws EJBException, RemoteException {
    }
    
public static void main(String[] arg){
    System.out.println(Integer.valueOf(Double.valueOf("9.0E7").intValue()+""));
}

 
    public double obtenerValorVigentePlazoA(Date fecha, int numdias) throws DatoInvalidoExcepcion, LogicaExcepcion, RemoteException {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
